/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
//BayesianNetwork
/*
 * JanelaPrincipal.java
 *
 * Created on 12/11/2012, 15:08:35
 */
package distribuicaoDeProfessores;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JFileChooser;

/**
 * 
 * @author Jaime
 * @author RhellCris
 * @version 0.3
 */
public class JanelaPrincipal extends javax.swing.JFrame {

	/** Creates new form JanelaPrincipal */
	public JanelaPrincipal() {
                this.setExtendedState(MAXIMIZED_BOTH);
		initComponents();
		setPainelInicial();
                bn = new BayesianNetwork(); //Instancia a Rede Bayesiana
                bn.buildNet(); //Constroi a Rede Bayesiana da parte1;
                bn.buildNetParte2(); //Constroi a Rede Bayesiana da parte 2;
                valorBarra=0;
		horario = new Horario();
                professoresComDisciplinas = new ProfessoresComDisciplinas(new ArrayList<ProfessoresAlocados>());
                professorAfinidadeAtividade = new ProfessorAfinidadeAtividade();
                atividadesCadastradas = new AtividadesCadastradas();
		cadastroDeDisciplina = new CadastroDeDisciplina();
		cadastroDeProfessor = new CadastroDeProfessor(
				cadastroDeDisciplina.getDisciplinas(), this);
		verDisciplinas = new VerDisciplinas(
				cadastroDeDisciplina.getDisciplinas());
		verProfessores = new VerProfessores(cadastroDeProfessor.getProfessores());
		alocacaoDeHorario = new RegistroDeHorario(horario,
				cadastroDeDisciplina.disciplinas);
		cadastroDeHorario = new CadastroDeHorario(horario);
		verDisciplinaPorPeriodo = new VerDisciplinaPorPeriodo(
                                cadastroDeDisciplina.getDisciplinas(), this); // DEVE RECEBER UM VETOR DE DISCIPLINAS
                relatorioDeDistribuicao = new RelatorioDeDistribuicao();
		cadastroDeAtividades = new CadastroDeAtividades(atividadesCadastradas, this);
		verHorarioCompleto = new VerHorarioCompleto();
		verHorarioPorPeriodo = new VerHorarioPorPeriodo();
                lancarAtividades = new LancarAtividades(relatorioDeDistribuicao, bn, atividadesCadastradas, professorAfinidadeAtividade, professoresComDisciplinas);
                relatorioDeAtividades = new RelatorioDeAtividades(professorAfinidadeAtividade);
                excluirHorariosEItens = new ExcluirHorariosEItens(horario);
                
                registroDeAfinidadeDeProfessor = new RegistroDeAfinidadeDeProfessor(
                            professorAfinidadeAtividade, atividadesCadastradas, 
                            cadastroDeProfessor.getProfessores());
                inicializarProfessoresComAfinidades();
               
	}

	private void setPainelInicial() {
		painelExibir.setVisible(false);
		painelExibir.removeAll();
		painelExibir.add(new PainelInicial(), java.awt.BorderLayout.CENTER);
		painelExibir.setVisible(true);
	}

	private void realocarReferencias() {

		cadastroDeHorario.horario = horario;
		alocacaoDeHorario.horario = horario;
		alocacaoDeHorario.disciplinas = cadastroDeDisciplina.getDisciplinas();
		cadastroDeProfessor.disciplinas = cadastroDeDisciplina.getDisciplinas();
                lancarAtividades.atividadesCadastradas= this.atividadesCadastradas;
                lancarAtividades.configuraListaDeNomes();
                cadastroDeAtividades.atividadesCadastradas = this.atividadesCadastradas;
                registroDeAfinidadeDeProfessor.setProfessores(cadastroDeProfessor.getProfessores());
                registroDeAfinidadeDeProfessor.setAtividades(atividadesCadastradas);
                registroDeAfinidadeDeProfessor.setAfinidadeProfessorAtividade(professorAfinidadeAtividade);
                excluirHorariosEItens.setHorario(horario);

	}

       public final void inicializarProfessoresComAfinidades() { //Segunda etapa
           while(!professorAfinidadeAtividade.getProfessores().isEmpty()){
                 professorAfinidadeAtividade.getProfessores().remove(0);//remove sempre no indice zero pois o arraylist é dinâmico e por isso quando se tira um ele é reajustado até que só se sobre um intem no indice zero
             }
             //javax.swing.JOptionPane.showMessageDialog(null,"Tamanho " + atividadesCadastradas.getAtividades().size());
             
             
             for (int i = 0; i < cadastroDeProfessor.getProfessores().getProfessores().size();i++){
              
                professorAfinidadeAtividade.addProfessor(cadastroDeProfessor.getProfessores().getProfessores().get(i), atividadesCadastradas);
             }
    
        }
	@SuppressWarnings("unchecked")
	// <editor-fold defaultstate="collapsed"
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        painelPrincipal = new javax.swing.JPanel();
        painelBotoes = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jButton10 = new javax.swing.JButton();
        jButton12 = new javax.swing.JButton();
        jButton11 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton7 = new javax.swing.JButton();
        jButton8 = new javax.swing.JButton();
        jButton1 = new javax.swing.JButton();
        jButton13 = new javax.swing.JButton();
        jButton6 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton9 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        painelExibir = new javax.swing.JPanel();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenuArquivo = new javax.swing.JMenu();
        jMenu5 = new javax.swing.JMenu();
        jMenuItem9 = new javax.swing.JMenuItem();
        jMenuItem10 = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        jMenu2 = new javax.swing.JMenu();
        jMenuCarregar = new javax.swing.JMenuItem();
        jMenuCarregar2 = new javax.swing.JMenuItem();
        jMenu1 = new javax.swing.JMenu();
        jMenuSalvar = new javax.swing.JMenuItem();
        jMenuSalvar2 = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JPopupMenu.Separator();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuEditar = new javax.swing.JMenu();
        jMenuItem3 = new javax.swing.JMenuItem();
        jSeparator3 = new javax.swing.JPopupMenu.Separator();
        jMenuItem7 = new javax.swing.JMenuItem();
        jMenuItem8 = new javax.swing.JMenuItem();
        jMenu4 = new javax.swing.JMenu();
        jMenuItem6 = new javax.swing.JMenuItem();
        jMenuItem5 = new javax.swing.JMenuItem();
        limparHorario = new javax.swing.JMenuItem();
        jMenu3 = new javax.swing.JMenu();
        cadAtividades = new javax.swing.JMenuItem();
        jMenuItem4 = new javax.swing.JMenuItem();
        jMenuSobre = new javax.swing.JMenu();
        jMenuItem2 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Disbribuição de Disciplinas UFG - DDUFG");
        getContentPane().setLayout(new java.awt.BorderLayout(1, 1));

        painelPrincipal.setBackground(new java.awt.Color(255, 204, 255));
        painelPrincipal.setLayout(new java.awt.BorderLayout());

        painelBotoes.setBackground(new java.awt.Color(153, 204, 255));
        painelBotoes.setLayout(new java.awt.GridLayout(15, 2));

        jLabel1.setBackground(new java.awt.Color(153, 204, 255));
        jLabel1.setFont(new java.awt.Font("Segoe Print", 0, 18));
        jLabel1.setForeground(new java.awt.Color(234, 253, 253));
        jLabel1.setText("      DDUFG");
        jLabel1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jLabel1MouseClicked(evt);
            }
        });
        painelBotoes.add(jLabel1);

        jButton10.setBackground(new java.awt.Color(153, 0, 0));
        jButton10.setFont(new java.awt.Font("Tahoma", 1, 12));
        jButton10.setForeground(new java.awt.Color(255, 255, 255));
        jButton10.setText("Relatorio de distribuição");
        jButton10.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton10.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton10ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton10);

        jButton12.setBackground(new java.awt.Color(255, 0, 0));
        jButton12.setFont(new java.awt.Font("Tahoma", 1, 11));
        jButton12.setText("Relatorio de Atividades");
        jButton12.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton12ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton12);

        jButton11.setBackground(new java.awt.Color(255, 0, 0));
        jButton11.setText("Lançar uma nova Atividade");
        jButton11.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton11ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton11);

        jButton2.setBackground(new java.awt.Color(255, 255, 102));
        jButton2.setText("Cadastro de Disciplina");
        jButton2.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(255, 102, 102)));
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton2);

        jButton7.setBackground(new java.awt.Color(255, 255, 204));
        jButton7.setText("Ver todas as Disciplinas");
        jButton7.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(255, 153, 153)));
        jButton7.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton7ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton7);

        jButton8.setBackground(new java.awt.Color(255, 255, 204));
        jButton8.setText("Ver Diciplinas por Periodo");
        jButton8.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(255, 153, 153)));
        jButton8.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton8ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton8);

        jButton1.setBackground(new java.awt.Color(153, 255, 153));
        jButton1.setText("Cadastro de Professor");
        jButton1.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(255, 102, 102)));
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton1);

        jButton13.setBackground(new java.awt.Color(204, 255, 204));
        jButton13.setText("Afinidades do Professor");
        jButton13.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton13ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton13);

        jButton6.setBackground(new java.awt.Color(204, 255, 204));
        jButton6.setText("Ver todos os professores");
        jButton6.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(255, 153, 153)));
        jButton6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton6ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton6);

        jButton3.setBackground(new java.awt.Color(51, 102, 255));
        jButton3.setText("Registro de Horário");
        jButton3.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED, null, new java.awt.Color(255, 51, 51), null, new java.awt.Color(255, 51, 51)));
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton3);

        jButton9.setBackground(new java.awt.Color(204, 255, 255));
        jButton9.setText("Criar um Horário");
        jButton9.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED, null, new java.awt.Color(255, 51, 51), null, new java.awt.Color(255, 51, 51)));
        jButton9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton9ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton9);

        jButton5.setBackground(new java.awt.Color(204, 255, 255));
        jButton5.setText("Ver todos os Horários");
        jButton5.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED, null, new java.awt.Color(255, 51, 51), null, new java.awt.Color(255, 51, 51)));
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton5);

        jButton4.setBackground(new java.awt.Color(204, 255, 255));
        jButton4.setText("Ver Horário por Periodo");
        jButton4.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED, null, new java.awt.Color(255, 51, 51), null, new java.awt.Color(255, 51, 51)));
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });
        painelBotoes.add(jButton4);

        jLabel2.setBackground(new java.awt.Color(255, 255, 255));
        jLabel2.setFont(new java.awt.Font("Segoe Print", 1, 10));
        jLabel2.setForeground(new java.awt.Color(218, 250, 250));
        jLabel2.setText("  SIAD / 2012-2013 - UFG");
        painelBotoes.add(jLabel2);

        painelPrincipal.add(painelBotoes, java.awt.BorderLayout.LINE_START);

        painelExibir.setBackground(new java.awt.Color(255, 255, 255));
        painelExibir.setLayout(new java.awt.BorderLayout());
        painelPrincipal.add(painelExibir, java.awt.BorderLayout.CENTER);

        getContentPane().add(painelPrincipal, java.awt.BorderLayout.CENTER);

        jMenuBar1.setBackground(new java.awt.Color(153, 204, 255));

        jMenuArquivo.setBackground(new java.awt.Color(246, 246, 246));
        jMenuArquivo.setText("Arquivo");
        jMenuArquivo.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N

        jMenu5.setBackground(new java.awt.Color(246, 246, 246));
        jMenu5.setText("Ver Redes Bayesianas");

        jMenuItem9.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_D, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem9.setBackground(new java.awt.Color(246, 246, 246));
        jMenuItem9.setText("1- Rede Distribuir Disciplinas");
        jMenuItem9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem9ActionPerformed(evt);
            }
        });
        jMenu5.add(jMenuItem9);

        jMenuItem10.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_D, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem10.setBackground(new java.awt.Color(246, 246, 246));
        jMenuItem10.setText("2- Rede Distribuir Atividade");
        jMenuItem10.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem10ActionPerformed(evt);
            }
        });
        jMenu5.add(jMenuItem10);

        jMenuArquivo.add(jMenu5);
        jMenuArquivo.add(jSeparator1);

        jMenu2.setBackground(new java.awt.Color(246, 246, 246));
        jMenu2.setText("Carregar");

        jMenuCarregar.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_MASK));
        jMenuCarregar.setBackground(new java.awt.Color(246, 246, 246));
        jMenuCarregar.setText("Carregar Horario");
        jMenuCarregar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuCarregarActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuCarregar);

        jMenuCarregar2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuCarregar2.setBackground(new java.awt.Color(246, 246, 246));
        jMenuCarregar2.setText("Carregar Atividades");
        jMenuCarregar2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuCarregar2ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuCarregar2);

        jMenuArquivo.add(jMenu2);

        jMenu1.setBackground(new java.awt.Color(246, 246, 246));
        jMenu1.setText("Salvar");

        jMenuSalvar.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        jMenuSalvar.setBackground(new java.awt.Color(246, 246, 246));
        jMenuSalvar.setText("Salvar Horario");
        jMenuSalvar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuSalvarActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuSalvar);

        jMenuSalvar2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuSalvar2.setBackground(new java.awt.Color(246, 246, 246));
        jMenuSalvar2.setText("Salvar Atividades");
        jMenuSalvar2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuSalvar2ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuSalvar2);

        jMenuArquivo.add(jMenu1);
        jMenuArquivo.add(jSeparator2);

        jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem1.setBackground(new java.awt.Color(246, 246, 246));
        jMenuItem1.setText("Sair");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenuArquivo.add(jMenuItem1);

        jMenuBar1.add(jMenuArquivo);

        jMenuEditar.setBackground(new java.awt.Color(246, 246, 246));
        jMenuEditar.setText("Editar");
        jMenuEditar.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N

        jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_D, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem3.setBackground(new java.awt.Color(246, 246, 246));
        jMenuItem3.setFont(new java.awt.Font("Segoe UI", 2, 14)); // NOI18N
        jMenuItem3.setForeground(new java.awt.Color(52, 12, 12));
        jMenuItem3.setText("Distribuir Disciplinas");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem3ActionPerformed(evt);
            }
        });
        jMenuEditar.add(jMenuItem3);
        jMenuEditar.add(jSeparator3);

        jMenuItem7.setBackground(new java.awt.Color(246, 246, 246));
        jMenuItem7.setText("Excluir Disciplinas");
        jMenuItem7.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem7ActionPerformed(evt);
            }
        });
        jMenuEditar.add(jMenuItem7);

        jMenuItem8.setBackground(new java.awt.Color(246, 246, 246));
        jMenuItem8.setText("Excluir Professores");
        jMenuItem8.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem8ActionPerformed(evt);
            }
        });
        jMenuEditar.add(jMenuItem8);

        jMenu4.setBackground(new java.awt.Color(246, 246, 246));
        jMenu4.setText("Horário");

        jMenuItem6.setBackground(new java.awt.Color(246, 246, 246));
        jMenuItem6.setText("Excluir um Horário ou Item");
        jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem6ActionPerformed(evt);
            }
        });
        jMenu4.add(jMenuItem6);

        jMenuItem5.setBackground(new java.awt.Color(246, 246, 246));
        jMenuItem5.setText("Excluir Professores do Horário");
        jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem5ActionPerformed(evt);
            }
        });
        jMenu4.add(jMenuItem5);

        limparHorario.setBackground(new java.awt.Color(246, 246, 246));
        limparHorario.setText("Limpar Horário");
        limparHorario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                limparHorarioActionPerformed(evt);
            }
        });
        jMenu4.add(limparHorario);

        jMenuEditar.add(jMenu4);

        jMenu3.setBackground(new java.awt.Color(246, 246, 246));
        jMenu3.setText("Atividades");

        cadAtividades.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        cadAtividades.setBackground(new java.awt.Color(246, 246, 246));
        cadAtividades.setText("Cadastrar Atividades");
        cadAtividades.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cadAtividadesActionPerformed(evt);
            }
        });
        jMenu3.add(cadAtividades);

        jMenuItem4.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem4.setBackground(new java.awt.Color(246, 246, 246));
        jMenuItem4.setText("Excluir uma atividade");
        jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem4ActionPerformed(evt);
            }
        });
        jMenu3.add(jMenuItem4);

        jMenuEditar.add(jMenu3);

        jMenuBar1.add(jMenuEditar);

        jMenuSobre.setBackground(new java.awt.Color(246, 246, 246));
        jMenuSobre.setText("Ajuda");
        jMenuSobre.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N

        jMenuItem2.setBackground(new java.awt.Color(246, 246, 246));
        jMenuItem2.setFont(new java.awt.Font("Segoe UI", 1, 12)); // NOI18N
        jMenuItem2.setForeground(new java.awt.Color(4, 4, 44));
        jMenuItem2.setText("Sobre");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem2ActionPerformed(evt);
            }
        });
        jMenuSobre.add(jMenuItem2);

        jMenuBar1.add(jMenuSobre);

        setJMenuBar(jMenuBar1);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-930)/2, (screenSize.height-536)/2, 930, 536);
    }// </editor-fold>//GEN-END:initComponents

        private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
            // Distribuir professores para as disciplinas
                        valorBarra=0;
                        relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
                        exibirRelatorioDeDistribuicao(); 
			distribuirProfessoresParaDisciplinas();
                        if(professoresComDisciplinas.getProfessoresComDisciplinas().isEmpty()) relatorioDeDistribuicao.areaTexto.setText("\tAntes de ver este relatorio é necessario distribuir as disciplinas para os professores.\n\tIsso pode ser feito no menu:\n\n\t\tEditar\\\n\t\t\tDistribuir Disciplinas\n\n\t\tOu presionando Ctrl+Alt+Shift+d\n\n\tSe for necessario cadastre as disciplinas, professores e o horário.");
        }//GEN-LAST:event_jMenuItem3ActionPerformed

        private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton10ActionPerformed
            // Botão Relatorio de Distribuição
            exibirRelatorioDeDistribuicao();    
        }//GEN-LAST:event_jButton10ActionPerformed

        private void jLabel1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel1MouseClicked
            setPainelInicial();
        }//GEN-LAST:event_jLabel1MouseClicked

        private void cadAtividadesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cadAtividadesActionPerformed
              painelExibir.setVisible(false);
		painelExibir.removeAll();
		
		painelExibir.add(cadastroDeAtividades, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
        }//GEN-LAST:event_cadAtividadesActionPerformed

        private void jButton11ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton11ActionPerformed
               painelExibir.setVisible(false);
		painelExibir.removeAll();
		lancarAtividades.configuraListaDeNomes();
		painelExibir.add(lancarAtividades, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
        }//GEN-LAST:event_jButton11ActionPerformed

        private void jMenuSalvar2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuSalvar2ActionPerformed
            JFileChooser fileChooser = new JFileChooser();
		fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
		configFiltrosJFileChooser(fileChooser, 2);
		int result = fileChooser.showSaveDialog(this);
		if (result == JFileChooser.CANCEL_OPTION) {
			return;
		}
		// ***************************************************
		
		String nomeArquivo = fileChooser.getSelectedFile().getAbsolutePath();
																	// disco
		// Garantindo que a extenção .ativ seja colocada ao final do arquivo
		if (!nomeArquivo.substring(nomeArquivo.length() - 5).equals(".ativ")) {
			nomeArquivo += ".ativ";
		}
		// ____________________________________________________
		try {
			arquivoSaida = new ObjectOutputStream(new FileOutputStream(
					nomeArquivo));
			// javax.swing.JOptionPane.showMessageDialog(null, "Escrever");
			arquivoSaida.writeObject(atividadesCadastradas); // Escreve na stream
			// javax.swing.JOptionPane.showMessageDialog(null, "Descarregar");
			arquivoSaida.flush(); // Descarrega a stream o arquivo no disco
									// (cria/salva o arquivo)
			arquivoSaida.close(); // Descarrega a stream e libera o arquivo
			
					
		} catch (IOException ioException) {
			javax.swing.JOptionPane
					.showMessageDialog(
							null,
							"O arquivo não pode ser salvo\n\n- O disco pode estar cheio\n\n- Ou não se tem permição para o procedimento !",
							"Erro de Entrada e Saída",
							javax.swing.JOptionPane.ERROR_MESSAGE);
		}
        }//GEN-LAST:event_jMenuSalvar2ActionPerformed

        private void jMenuCarregar2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuCarregar2ActionPerformed
            JFileChooser fileChooser = new JFileChooser();
		fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
		configFiltrosJFileChooser(fileChooser, 2);

		int result = fileChooser.showOpenDialog(this);
		if (result == JFileChooser.CANCEL_OPTION) {
			return;
		}

		// **********************************
		
		String nomeArquivo = fileChooser.getSelectedFile().getAbsolutePath();
		// javax.swing.JOptionPane.showMessageDialog(null, nomeArquivo);
		try {
			arquivoEntrada = new ObjectInputStream(new FileInputStream(
					nomeArquivo));
			try {
				atividadesCadastradas = (AtividadesCadastradas) arquivoEntrada.readObject();
				arquivoEntrada.close();
                                
                                realocarReferencias();
                                inicializarProfessoresComAfinidades();
                                setPainelInicial();
                                
			} catch (ClassNotFoundException ex) {
				javax.swing.JOptionPane
						.showMessageDialog(
								null,
								"Erro de Entrada e Saída\nErro de abertura do arquivo",
								"Erro de Entrada e Saída",
								javax.swing.JOptionPane.ERROR_MESSAGE);
				arquivoEntrada.close();
				return;
			}
			

			
			//realocarReferencias(); // Realocar Referencias Horario
			
		} catch (IOException ioException) {
			javax.swing.JOptionPane
					.showMessageDialog(
							null,
							"O Arquivo não pode ser carregado\nVerifique se o nome foi digitado corretamente ou\nse Ã© compativel ou se ele realmente existe.");
		}
        }//GEN-LAST:event_jMenuCarregar2ActionPerformed

        private void jButton12ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton12ActionPerformed
                painelExibir.setVisible(false);
		painelExibir.removeAll();
		relatorioDeAtividades.atualizaRelatorio(professoresComDisciplinas);
		painelExibir.add(relatorioDeAtividades, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
        
        }//GEN-LAST:event_jButton12ActionPerformed

        private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem4ActionPerformed
           //Excluir uma atividade cadastrada
            String resposta = "";
            int indice = 0;
            try{
            resposta = javax.swing.JOptionPane.showInputDialog("Digite o indice da atividade que será excluida\nDigital all para apagar todas.");    
            if(!resposta.equals("all")){ 
            indice = Integer.parseInt(resposta);
            try{
                atividadesCadastradas.removeAtividade(indice);
                 javax.swing.JOptionPane.showMessageDialog(null,"Atividade Excluída com sucesso");
                 lancarAtividades.configuraListaDeNomes();
            } catch(Exception e){
               javax.swing.JOptionPane.showMessageDialog(null, "A atividade não foi excluida.\nO indice pode ser inválido", "Erro!", javax.swing.JOptionPane.ERROR_MESSAGE );
            }
            }
            else{
                while(!atividadesCadastradas.getAtividades().isEmpty())
                            atividadesCadastradas.getAtividades().remove(0);
                 javax.swing.JOptionPane.showMessageDialog(null, "Todas as atividades foram excluídas com sucesso!");
            }
            
           }catch(Exception e){
                javax.swing.JOptionPane.showMessageDialog(null, "Indice inválido", "Erro!", javax.swing.JOptionPane.ERROR_MESSAGE );
            }
           
        }//GEN-LAST:event_jMenuItem4ActionPerformed

        private void jButton13ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton13ActionPerformed
               //Cadastro de afinidades do professor (etapa 2 do trabalho)
                painelExibir.setVisible(false);
		painelExibir.removeAll();
		registroDeAfinidadeDeProfessor.configuraFrames();
                registroDeAfinidadeDeProfessor.configuraListaProfessores();
		painelExibir.add(registroDeAfinidadeDeProfessor, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
                registroDeAfinidadeDeProfessor.setarValores();
		painelExibir.setVisible(true);
        }//GEN-LAST:event_jButton13ActionPerformed

        private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem5ActionPerformed
            removerProfessoresDoHorario();
        }//GEN-LAST:event_jMenuItem5ActionPerformed

        private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed
            //Excluir um item ou horário 
            painelExibir.setVisible(false);
		painelExibir.removeAll();
                //javax.swing.JOptionPane.showMessageDialog(null,"Quant horario "+ horario.getHorario().size());
		excluirHorariosEItens.configuraListaDeHorarios();
                excluirHorariosEItens.configuraListaDeItens();
		painelExibir.add(excluirHorariosEItens, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
        }//GEN-LAST:event_jMenuItem6ActionPerformed

        private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem7ActionPerformed
            //Excluir uma disciplina
            String resposta = "";
            int indice = 0;
            try{
            resposta = javax.swing.JOptionPane.showInputDialog("Digite o indice da disciplina que será excluida\nDigital all para apagar todas.");    
            if(!resposta.equals("all")){ 
            indice = Integer.parseInt(resposta);
            try{
                String nome =  cadastroDeDisciplina.getDisciplinas().getDisciplinas().get(indice).getNome();
                cadastroDeDisciplina.getDisciplinas().removeDisciplina(indice);
                 //Se ecluiu uma disciplina, deve-se apagar os intens de horaria que as possui
                   for(int i=0; i < horario.getHorario().size(); i++)
                     for(int j = 0; j < horario.getHorario().get(i).getItemList().size(); j++)
                         if(horario.getHorario().get(i).getItem(j).getDisciplina().getNome().equals(nome)){
                             horario.getHorario().get(i).removeItem(j);
                             j--;
                     }
                
                 javax.swing.JOptionPane.showMessageDialog(null,"A disciplina " +nome+" foi excluída com sucesso");
                //reconfigurando telas 
                for(int i = 1; i <= 8; i++)verHorarioPorPeriodo.configurarImpressao(horario, i);
		verDisciplinaPorPeriodo.atualizar(cadastroDeDisciplina.getDisciplinas());
                verDisciplinas.atualizar(cadastroDeDisciplina.getDisciplinas());
                verHorarioCompleto.configurarImpressao(horario);
                
                excluirHorariosEItens.configuraListaDeHorarios();
                excluirHorariosEItens.configuraListaDeItens();
                
            } catch(Exception e){
               javax.swing.JOptionPane.showMessageDialog(null, "A disciplina não foi excluida.\nO indice pode ser inválido.", "Erro!", javax.swing.JOptionPane.ERROR_MESSAGE );
            }
            }
            else{
                while(!cadastroDeDisciplina.getDisciplinas().getDisciplinas().isEmpty())
                           cadastroDeDisciplina.getDisciplinas().getDisciplinas().remove(0);
                //Se todos as disciplinas foram excluidas todos os intens horarios devem ser tambem
                 for(int i=0; i < horario.getHorario().size(); i++)
                     while(!horario.getHorario().get(i).getItemList().isEmpty())
                           horario.getHorario().get(i).removeItem(0);
                 //O 0(zero) estático é necessario pois quando se remos um item do array
                 //List os outros caem um indice assim o zero fixo ira ser o indice do ultimo
                 //elemento a ser excluído.
                 //Menssagem de confirmação
                 javax.swing.JOptionPane.showMessageDialog(null, "Todas as disciplinas foram excluídas com sucesso!");
                 
                   //reconfigurando telas 
                for(int i = 1; i <= 8; i++)verHorarioPorPeriodo.configurarImpressao(horario, i);
		verDisciplinaPorPeriodo.atualizar(cadastroDeDisciplina.getDisciplinas());
                verDisciplinas.atualizar(cadastroDeDisciplina.getDisciplinas());
                verHorarioCompleto.configurarImpressao(horario);
                
                excluirHorariosEItens.configuraListaDeHorarios();
                excluirHorariosEItens.configuraListaDeItens();
            }
            
           }catch(Exception e){
                javax.swing.JOptionPane.showMessageDialog(null, "Indice inválido", "Erro!", javax.swing.JOptionPane.ERROR_MESSAGE );
            }
        }//GEN-LAST:event_jMenuItem7ActionPerformed

        private void jMenuItem8ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem8ActionPerformed
            //Excluir Professor
            String resposta = "";
            
            int indice = 0;
            try{
            resposta = javax.swing.JOptionPane.showInputDialog("Digite o indice do professor(a) que será excluido\nDigital all para apagar todos.");    
            if(!resposta.equals("all")){ 
            indice = Integer.parseInt(resposta);
            try{
                
                
                    String  nome =  cadastroDeProfessor.getProfessores().getProfessores().get(indice).getNome();
                cadastroDeProfessor.getProfessores().removePrefessor(indice);
                 //Se excluiu um professor, deve-se apagalo dos intes de horario.
                   for(int i=0; i < horario.getHorario().size(); i++)
                     for(int j = 0; j < horario.getHorario().get(i).getItemList().size(); j++)
                         if(horario.getHorario().get(i).getItem(j).getProfessor()!=null)
                          if(horario.getHorario().get(i).getItem(j).getProfessor().getNome().equals(nome)){
                             horario.getHorario().get(i).getItemList().get(j).setProfessor(null);
                             j--;
                     }
                
                 javax.swing.JOptionPane.showMessageDialog(null,"O(A) professor(a) " +nome+" foi excluído(a) com sucesso");
                //reconfigurando telas 
                for(int i = 1; i <= 8; i++)verHorarioPorPeriodo.configurarImpressao(horario, i);
		
                verProfessores.atualizar(cadastroDeProfessor.getProfessores());
                verHorarioCompleto.configurarImpressao(horario);
                
                excluirHorariosEItens.configuraListaDeHorarios();
                excluirHorariosEItens.configuraListaDeItens();
                
            } catch(Exception e){
               javax.swing.JOptionPane.showMessageDialog(null, "O Professor(a) não foi excluido(a).\nO indice pode ser inválido.", "Erro!", javax.swing.JOptionPane.ERROR_MESSAGE );
            }
            }
            else{
                while(!cadastroDeProfessor.getProfessores().getProfessores().isEmpty())
                           cadastroDeProfessor.getProfessores().getProfessores().remove(0);
                //Se todos os foram excluidos todos os intens horarios devem ficam sem professor
                 removerProfessoresDoHorario();
                 
                 //Menssagem de confirmação
                 javax.swing.JOptionPane.showMessageDialog(null, "Todos os professores foram excluídas com sucesso!");
                 
                   //reconfigurando telas 
                for(int i = 1; i <= 8; i++)verHorarioPorPeriodo.configurarImpressao(horario, i);
		
                verProfessores.atualizar(cadastroDeProfessor.getProfessores());
                verHorarioCompleto.configurarImpressao(horario);
                
                excluirHorariosEItens.configuraListaDeHorarios();
                excluirHorariosEItens.configuraListaDeItens();
            }
            
           }catch(Exception e){
                javax.swing.JOptionPane.showMessageDialog(null, "Indice inválido", "Erro!", javax.swing.JOptionPane.ERROR_MESSAGE );
            }
        }//GEN-LAST:event_jMenuItem8ActionPerformed

        private void jMenuItem9ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem9ActionPerformed
           bn.desenhaRede("DistribuicaoHorarios.dne");
        }//GEN-LAST:event_jMenuItem9ActionPerformed

        private void jMenuItem10ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem10ActionPerformed
           bn.desenhaRede("DistribuicaoAtividades.dne");
        }//GEN-LAST:event_jMenuItem10ActionPerformed
        void exibirRelatorioDeDistribuicao(){
                painelExibir.setVisible(false);
		painelExibir.removeAll();
		
		painelExibir.add(relatorioDeDistribuicao, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
        }
	private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jMenuItem1ActionPerformed
		System.exit(0); // Sair do programa
	}// GEN-LAST:event_jMenuItem1ActionPerformed

	private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jButton7ActionPerformed
		// Botão ver disciplinas
		painelExibir.setVisible(false);
		painelExibir.removeAll();
		verDisciplinas.atualizar(cadastroDeDisciplina.getDisciplinas());
		painelExibir.add(verDisciplinas, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
	}// GEN-LAST:event_jButton7ActionPerformed

	private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jButton6ActionPerformed
		// Botão Visualizar todos os professores

		painelExibir.setVisible(false);
		painelExibir.removeAll();
		verProfessores.atualizar(cadastroDeProfessor.getProfessores());
		painelExibir.add(verProfessores, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);

	}// GEN-LAST:event_jButton6ActionPerformed

	private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jButton1ActionPerformed
		// Botão Cadastro de professor
		painelExibir.setVisible(false);
		painelExibir.removeAll();
		cadastroDeProfessor
				.comboboxmodel(cadastroDeDisciplina.getDisciplinas());
		painelExibir.add(cadastroDeProfessor, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
	}// GEN-LAST:event_jButton1ActionPerformed

	private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jButton9ActionPerformed
		// Botãoo Criar Horário
		painelExibir.setVisible(false);
		painelExibir.removeAll();
		painelExibir.add(cadastroDeHorario, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
	}// GEN-LAST:event_jButton9ActionPerformed

	private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jButton3ActionPerformed
		// Botão Cadastro de horario
		painelExibir.setVisible(false);
		painelExibir.removeAll();
		alocacaoDeHorario.comboboxmodelDisciplina(cadastroDeDisciplina
				.getDisciplinas());
		alocacaoDeHorario.comboboxmodelHorario(horario);
		painelExibir.add(alocacaoDeHorario, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
	}// GEN-LAST:event_jButton3ActionPerformed

	private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jButton2ActionPerformed
		// BotÃ£o Cadastro de Disciplinas
		painelExibir.setVisible(false);
		painelExibir.removeAll();
		painelExibir.add(cadastroDeDisciplina, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
	}// GEN-LAST:event_jButton2ActionPerformed

	private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jButton8ActionPerformed
		// Botão ver disciplina por periodo
		acaoVerDisciplinaPorPeriodo();
	}// GEN-LAST:event_jButton8ActionPerformed

	void acaoVerDisciplinaPorPeriodo() {
		/*
		 * Este modo foi criado a parte pois ele vai ser chamado na aÃ§Ã£o do
		 * botÃ£o jbutton8 nesta classe e tambem na aÃ§Ã£o do combobox periodo
		 * da classe VerDiciplinaPorPeriodo
		 */
		painelExibir.setVisible(false);
		painelExibir.removeAll();
		verDisciplinaPorPeriodo.atualizar(cadastroDeDisciplina.getDisciplinas());
		painelExibir.add(verDisciplinaPorPeriodo, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
	}

	private void jMenuSalvarActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jMenuSalvarActionPerformed
		JFileChooser fileChooser = new JFileChooser();
		fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
		configFiltrosJFileChooser(fileChooser, 1);
		int result = fileChooser.showSaveDialog(this);
		if (result == JFileChooser.CANCEL_OPTION) {
			return;
		}
		// ***************************************************
		Dados dados = new Dados(cadastroDeProfessor.getProfessores(),
				cadastroDeDisciplina.getDisciplinas(), horario);
		String nomeArquivo = fileChooser.getSelectedFile().getAbsolutePath(); 
																				
		// Garantindo que a extenção .hufg seja colocada ao final do arquivo
		if (!nomeArquivo.substring(nomeArquivo.length() - 5).equals(".hufg")) {
			nomeArquivo += ".hufg";
		}
		// ____________________________________________________
		try {
			arquivoSaida = new ObjectOutputStream(new FileOutputStream(
					nomeArquivo));
			// javax.swing.JOptionPane.showMessageDialog(null, "Escrever");
			arquivoSaida.writeObject(dados); // Escreve na stream
			// javax.swing.JOptionPane.showMessageDialog(null, "Descarregar");
			arquivoSaida.flush(); // Descarrega a stream o arquivo no disco
									// (cria/salva o arquivo)
			arquivoSaida.close(); // Descarrega a stream e libera o arquivo
			this.setTitle("Distribuição de Disciplinas UFG - DDUFG: "
					+ nomeArquivo);
		} catch (IOException ioException) {
			javax.swing.JOptionPane
					.showMessageDialog(
							null,
							"O arquivo não pode ser salvo\n\n- O disco pode estar cheio\n\n- Ou não se tem permição para o procedimento !",
							"Erro de Entrada e Saída",
							javax.swing.JOptionPane.ERROR_MESSAGE);
		}
	}// GEN-LAST:event_jMenuSalvarActionPerformed
/*
	public void carregarProfessores() {
		File arq = new File(
				"C://Teste//preferencias professores.csv");
		try {
			FileReader fileReader = new FileReader(arq);
			BufferedReader bufferedReader = new BufferedReader(fileReader);
			String linha = "";

			// Lista que irÃ¡ guardar o resultado, ou seja, cada linha do
			// arquivo que corresponde a uma disciplina
			List<String> registro = new ArrayList<String>();

			while ((linha = bufferedReader.readLine()) != null) {
				// System.out.println(linha);
				if (linha != null && !linha.isEmpty()) {
					registro.add(linha);
				}
			}
			fileReader.close();
			bufferedReader.close();

			ArrayList<Professor> listaProfessores = new ArrayList<Professor>();
			String nome;
			int id;
			Disciplina d1, d2, d3, d4, d5, d6, d7, d8, d9;
			for (String s : registro) {
				// Usamos o método split da classe String
				// para separar as partes entre os ponto e vírgulas.
				// Guardamos o resultado em um array
				String[] linhaArqProf = s.split(";");

				// Criamos um objeto User e setamos em seus atributos
				// as posiÃ§Ãµes correspondentes do array
				id = Integer.valueOf(linhaArqProf[0]);
				nome = linhaArqProf[1];

				// aqui vou pegar a lista de disciplinas pelo arquivo que gerei
				// com as preferÃªncias de cada professor.
				d1 = retornaDisciplinaDePreferencia(Integer
						.valueOf(linhaArqProf[2]));
				d2 = retornaDisciplinaDePreferencia(Integer
						.valueOf(linhaArqProf[3]));
				d3 = retornaDisciplinaDePreferencia(Integer
						.valueOf(linhaArqProf[4]));
				d4 = retornaDisciplinaDePreferencia(Integer
						.valueOf(linhaArqProf[5]));
				d5 = retornaDisciplinaDePreferencia(Integer
						.valueOf(linhaArqProf[6]));
				d6 = retornaDisciplinaDePreferencia(Integer
						.valueOf(linhaArqProf[7]));
				d7 = retornaDisciplinaDePreferencia(Integer
						.valueOf(linhaArqProf[8]));
				d8 = retornaDisciplinaDePreferencia(Integer
						.valueOf(linhaArqProf[9]));
				d9 = retornaDisciplinaDePreferencia(Integer
						.valueOf(linhaArqProf[10]));

				Professor p = new Professor(nome, id, d1, d2, d3, d4, d5, d6,
						d7, d8, d9);

				listaProfessores.add(p);
			}
			// setando os a lista de professores
			Professores professoresCarregados = new Professores();
			professoresCarregados.setProfessores(listaProfessores);
			cadastroDeProfessor.setProfessores(professoresCarregados);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Disciplina retornaDisciplinaDePreferencia(int idDisciplina) {
		Disciplinas listaDisciplinas;
		listaDisciplinas = cadastroDeDisciplina.getDisciplinas();

		for (int i = 0; i < listaDisciplinas.getDisciplinas().size(); i++) {
			if (listaDisciplinas.getDisciplinas().get(i).getId() == idDisciplina) {
				// System.out.println(listaDisciplinas.getDisciplinas().get(i).toString());
				return listaDisciplinas.getDisciplinas().get(i);
			}
		}
		return null; // caso nÃ£o encontre a disciplina retorna null
	}

    @SuppressWarnings("CallToThreadDumpStack")
	public void carregarHorarioAulas() {
		File arq = new File(
				"C://Teste//registro de horarios.csv");
		try {
			FileReader fileReader = new FileReader(arq);
			BufferedReader bufferedReader = new BufferedReader(fileReader);
			String linha = "";

			// Lista que irÃ¡ guardar o resultado, ou seja, cada linha do
			// arquivo que corresponde a uma disciplina
			List<String> registro = new ArrayList<String>();

			while ((linha = bufferedReader.readLine()) != null) {
				// System.out.println(linha);
				if (linha != null && !linha.isEmpty()) {
					registro.add(linha);
				}
			}
			fileReader.close();
			bufferedReader.close();

			List<HorarioAlocado> listaHorarioAlocado = new ArrayList<HorarioAlocado>();
			Dia dia;
			String horaIni, horaFim, local;
			Hora horaInicial, horaFinal;
			ItensHorario itemHorario;
			int idDisciplina;
			Disciplina disciplina;
			for (String s : registro) {
				// Usamos o mÃ©todo split da classe String
				// para separar as partes entre os ponto e vÃ­rgulas.
				// Guardamos o resultado em um array
				String[] linhaHorario = s.split(";");

				// Criamos um objeto User e setamos em seus atributos
				// as posiÃ§Ãµes correspondentes do array
				dia = new Dia(Integer.valueOf(linhaHorario[0]));
				horaIni = linhaHorario[1];
				horaFim = linhaHorario[2];
				idDisciplina = Integer.valueOf(linhaHorario[3]);
				local = linhaHorario[4];

				// Nesse parte do cÃ³digo para respeitar as classes do jaime
				// pego as horas e minutos e crio a lanÃ§o no classe Dia.
				String[] linhaHora = horaIni.split(":");
				horaInicial = new Hora(Integer.valueOf(linhaHora[0]),
						Integer.valueOf(linhaHora[1]));
				linhaHora = horaFim.split(":");
				horaFinal = new Hora(Integer.valueOf(linhaHora[0]),
						Integer.valueOf(linhaHora[1]));

				HorarioAlocado horarioAlocado = new HorarioAlocado(dia,
						horaInicial, horaFinal);

				// Aqui setarei a lista de disciplinas no horÃ¡rio
				disciplina = retornaDisciplinaDePreferencia(idDisciplina);
				itemHorario = new ItensHorario(disciplina, local);
				horarioAlocado.setNovoItem(itemHorario);

				horario.addHorario(horarioAlocado);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}*/

	// Alocar primeiramente os professores que apenas eles escolheram uma
	// determinada disciplina
	public void distribuirDisciplinasQueSomenteUmProfessorEscolheu(
			ArrayList<ProfessoresAlocados> professoresComDisciplinas) {

		Professor professorAtual = null;
		Disciplina disciplinaAtual = null;
		int qtdProfessores = 0;
                relatorioDeDistribuicao.areaTexto.append("VERIFICAR DISCIPLINAS PARA ENCONTRAR AS QUE SÓ UM PROFESSOR ESCOLHEU:\n\n");
		// Percorrendo todas as disciplinas cadastradas
		for (int i = 0; i < cadastroDeDisciplina.getDisciplinas().getDisciplinas().size(); i++) {
			relatorioDeDistribuicao.areaTexto.append(cadastroDeDisciplina.getDisciplinas().getDisciplinas().get(i).getId()
					+ " - " + cadastroDeDisciplina.getDisciplinas().getDisciplinas().get(i).getNome()
					+ " - " + cadastroDeDisciplina.getDisciplinas().getDisciplinas().get(i).getPeriodo()+"º Periodo: \n\n\n");
                         relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
			// Nesse código eu pego a disciplina atual e uma variável
			// contadora para saber quantos professores
			// desejam ministrar aquela disciplina. caso seja apenas 1 professor
			// ele será alocado para a disciplina
			if (!cadastroDeDisciplina.getDisciplinas().getDisciplinas().get(i).equals(disciplinaAtual)) {
				disciplinaAtual = cadastroDeDisciplina.getDisciplinas().getDisciplinas().get(i);
				qtdProfessores = 0;
			}

			for (int j = 0; j < cadastroDeProfessor.getProfessores().getProfessores().size(); j++) {
                                relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
				int prioridade = cadastroDeProfessor.getProfessores().getProfessores().get(j).verificar(disciplinaAtual);
				professorAtual = cadastroDeProfessor.getProfessores().getProfessores().get(j);
				if (prioridade == 1 || prioridade == 2) {
					
					qtdProfessores++;
				}

				// aqui vou verificar se foi percorrido todos os funcionarios
				// para disciplina atual
				// caso tenha apenas 1 professor que selecionou a disciplina vou
				// alocar ela para o professor.
				// essa foi uma das heuristicas criadas.
                                
				if ((j == cadastroDeProfessor.getProfessores().getProfessores().size() - 1) && (qtdProfessores == 1)) {
                                        //Sair do professorAtual que é o ultimo professor da lista 
                                        //e setar o unico professor que escolheu a disciplina como média ou alta
                                        for (int z = 0; z < cadastroDeProfessor.getProfessores().getProfessores().size(); z++) {
                                				
                                        professorAtual = cadastroDeProfessor.getProfessores().getProfessores().get(z);
                                        prioridade = professorAtual.verificar(disciplinaAtual);
                                	if(prioridade == 1 || prioridade == 2) break;
                                                
                                        }  
					//continuando... agora a disciplina será alcoa ao professor
                                        
                                        for (int iCount = 0; iCount < horario.getHorario().size(); iCount++) {
					
                                                for(int z = 0; z < horario.getHorario().get(iCount).getItemList().size(); z++)
						if (disciplinaAtual.equals(horario.getHorario().get(iCount).getItem(z).getDisciplina())) {
							relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
							horario.getHorario().get(iCount).getItem(z).setProfessor(professorAtual);
                                                   
                                                        //alocarDisciplinaParaProfessor(disciplinaAtual, professorAtual, professoresComDisciplinas);
							// Foi criado uma lista de "PROFESSORES ALOCADOS"
							// nessa lista eu verifico os professores que
							// que tem disciplinas alocadas e a quantidade de
							// disciplinas.
							int pos = retornaPosicaoProfessorNaLista(professorAtual, professoresComDisciplinas);
							if (pos == -1) {
								ProfessoresAlocados profAlocados = new ProfessoresAlocados(professorAtual);
								profAlocados.incrementaDisciplinasProfessor();
								profAlocados.adicionarDisciplina(disciplinaAtual);
								professoresComDisciplinas.add(profAlocados);
                                                                //Cada intem horário é correpondente a uma Carga horaria de 2 horas
                                                                professoresComDisciplinas.get(professoresComDisciplinas.size()-1).addChD(2);
							} else {
								boolean disciplinaJaAlocada = false;
                                                                professoresComDisciplinas.get(pos).addChD(2);
								for (int x = 0; x < professoresComDisciplinas.get(pos).getDisciplinasPegas().size(); x++) {
									if (disciplinaAtual.equals(professoresComDisciplinas.get(pos).getDisciplinasPegas().get(x))) {
										disciplinaJaAlocada = true;
										break;
									}
								}
								if (!disciplinaJaAlocada) {
									professoresComDisciplinas.get(pos).incrementaDisciplinasProfessor();
								}
							}
						}
					}
				}
			}
                        relatorioDeDistribuicao.areaTexto.append("\t\tExistem " + qtdProfessores + " enteressados nesta disciplina com prioridade média ou alta.\n\n");
            }
        }
	public int retornaPosicaoProfessorNaLista(Professor professor,
			ArrayList<ProfessoresAlocados> professoresComDisciplinas) {
		for (int i = 0; i < professoresComDisciplinas.size(); i++) {
			if (professoresComDisciplinas.get(i).getProfessor()
					.equals(professor)) {
                            relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
				return i;
			}
		}
		return -1;
	}

	public boolean verificarSeExisteProfessorParaDisciplina(Disciplina d,
			ArrayList<ProfessoresAlocados> lista) {
		for (int i = 0; i < lista.size(); i++) {
			for (int j = 0; j < lista.get(i).getDisciplinasPegas().size(); j++) {
                            relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
				if (lista.get(i).getDisciplinasPegas().get(j).equals(d)) {
					return true;
				}
			}
		}
		return false;
	}

	public void distribuirDisciplinasParaProfessores(ArrayList<ProfessoresAlocados> professoresComDisciplinas) {
		
		relatorioDeDistribuicao.areaTexto.append("\n\n DISTRIBUINDO DISCIPLINAS PARA OS PROFESSORES\n\n");
          //Disciplinas temporaria 
         //Auxiliam na distribuição de disciplinas permindio um shuffle sem
        //alterar a ordem original das diciplinas cadatradas no cadastroDeDisciplina
       
                //Criando um cópia das disciplinas
                 Disciplinas disciplinasTemp = new Disciplinas();
                 for(int abc = 0; abc < cadastroDeDisciplina.getDisciplinas().getDisciplinas().size(); abc++){
                     disciplinasTemp.addDisciplina(cadastroDeDisciplina.getDisciplinas().getDisciplinas().get(abc));
                 }
                 Collections.shuffle(disciplinasTemp.getDisciplinas());
                 //Fazemos um embaralhamento da ordem das diciplinas para evitar vicios na escolha
                 //que pode prejudicar um professor que escolheu como maior prioridade apenas
                 //diciplias que são avaliadas no inicio.
                 //Fim da criação da cópia de disciplinas
                 
		Professor professorAtual = null;
		Disciplina disciplinaAtual = null;
                //O arrayLista abaixo quarda a probabilidade de cada professor pegar um disciplina em um intervalo de tempo específico
		List<ProfessoresPorDisciplina> professoresPorDisciplinas = new ArrayList<ProfessoresPorDisciplina>();
		relatorioDeDistribuicao.areaTexto.append("\n\n\tAs Disciplinas cujo apenas um professor demonstrou interesse em pega-la já foram verificadas...\n\tAgora verificando as disciplinas restantes e escolendo professores:\n\n\n");
                // Percorrendo todas as disciplinas cadastradas
		while(!disciplinasTemp.getDisciplinas().isEmpty()) {
                    //Usa-se o indice 0 para pegar a primeira disciplina 
                    // na ordem sorteada, depois se exclui tal registro.
                    relatorioDeDistribuicao.areaTexto.append(disciplinasTemp.getDisciplinas().get(0).getId()
					+ " - " + disciplinasTemp.getDisciplinas().get(0).getNome()
					+ " - " + disciplinasTemp.getDisciplinas().get(0).getPeriodo()+"º Periodo: \n\n\n");
                        relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
			
			if (!disciplinasTemp.getDisciplinas().get(0).equals(disciplinaAtual)) {
				disciplinaAtual = disciplinasTemp.getDisciplinas().get(0);
			}

			boolean disciplinaComProfessor = verificarSeExisteProfessorParaDisciplina(disciplinaAtual, professoresComDisciplinas);
			if (disciplinaComProfessor) {
				relatorioDeDistribuicao.areaTexto.append("\nJá existe professor para esta disciplina\n");
				disciplinasTemp.removeDisciplina(0);
                                continue;
			}
                        

			//Aqui serão levantados os dados submetidos a rede bayesiana
			ProfessoresPorDisciplina profPorDisciplina = new ProfessoresPorDisciplina(disciplinaAtual);
			ProfessorProbabilidade professorProbabilidade;
			double crenca;
			String prioridadeBN = "alta", qtdDisciplinasBN = "zero", choqueHorarioBN = "nao", DisciplinaMediaOuAlta = "nao";
			int posicaoProfNaLista = -1;

			for (int j = 0; j < cadastroDeProfessor.getProfessores().getProfessores().size(); j++) {
				
                                relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
				int prioridade = cadastroDeProfessor.getProfessores().getProfessores().get(j).verificar(disciplinaAtual);
				professorAtual = cadastroDeProfessor.getProfessores().getProfessores().get(j);
                                DisciplinaMediaOuAlta = "nao"; //Reincializa a variável
                                posicaoProfNaLista = retornaPosicaoProfessorNaLista(professorAtual, professoresComDisciplinas);
					//Preparando dado de prioridade
					switch (professorAtual.verificar(disciplinaAtual)) {
						case 1: prioridadeBN = "alta";  break;
						case 2: prioridadeBN = "media"; break;
						case 3: prioridadeBN = "baixa"; break;
                                                case 0: prioridadeBN = "nula"; break;
					}
                                       
					if (posicaoProfNaLista >= 0) {
						switch (professoresComDisciplinas.get(posicaoProfNaLista).getQtdDisciplinas()) {
						case 0:
							qtdDisciplinasBN = "zero";
							break;
						case 1:
							qtdDisciplinasBN = "uma";
							break;
						case 2:
							qtdDisciplinasBN = "duas";
							break;
						case 3:
							qtdDisciplinasBN = "tres";
							break;
						}
					} else {
						qtdDisciplinasBN = "zero";
					}
					
					// Verificando se existe choque de horário da disciplina para o professor
					if (verificarChoqueHorario(professorAtual, disciplinaAtual)) { 
						choqueHorarioBN = "sim";
					} else {
						choqueHorarioBN = "nao";
					}
                                        
                                        //Verifica se o professor já possui um disciplina de prioridade alta ou media
                                       if (posicaoProfNaLista >= 0) { //Verificação necessaria pois o professor pode não estar na lista por não ter disciplinas.
                                        for(int x=0; x < professoresComDisciplinas.get(posicaoProfNaLista).getDisciplinasPegas().size(); x++){
                                            int temDisciplina = professorAtual.verificar(professoresComDisciplinas.get(posicaoProfNaLista).getDisciplinasPegas().get(x));
                                            if(temDisciplina == 1 || temDisciplina == 2){
						DisciplinaMediaOuAlta = "sim"; break;
                                            }
                                         }
                                       }
                                                
                                                                                
                                        //Usando a Rede Bayesiana
					crenca = bn.inferirProbabilidade(qtdDisciplinasBN, prioridadeBN, choqueHorarioBN, DisciplinaMediaOuAlta );
					professorProbabilidade = new ProfessorProbabilidade(professorAtual, crenca);
                                        //Fim da inferencia da crença
					profPorDisciplina.adicionarProfessor(professorProbabilidade);
                                        relatorioDeDistribuicao.areaTexto.append("\t"+professorAtual.getNome()+ ": a prioridade é " + prioridadeBN + 
                                                ", já pegou "+ qtdDisciplinasBN + " discplinas, "+ choqueHorarioBN +" houve choque de horario"+
                                                ",\n "+DisciplinaMediaOuAlta +" tem disciplina de prioridade média ou alta \t->  Crença: "+crenca+"\n\n");
				
			}
                        
			professoresPorDisciplinas.add(profPorDisciplina);
			
			// Alocar a disciplina para o professor que tiver a maior probabilidade
			Collections.shuffle(profPorDisciplina.getProfessores()); // Para gerar, ir revezando os professores para a disciplina eu embaralho a lista dos professores.
			Professor professorMaiorProbabilidade = null;
			double maiorProbabilidade = 0;
			for(int iCount = 0; iCount < profPorDisciplina.getProfessores().size(); iCount++) {
				if(profPorDisciplina.getProfessores().get(iCount).getProbabilidadePegarDisciplina() > maiorProbabilidade) {
					maiorProbabilidade = profPorDisciplina.getProfessores().get(iCount).getProbabilidadePegarDisciplina(); 
					professorMaiorProbabilidade = profPorDisciplina.getProfessores().get(iCount).getProfessores();
				}
			}
			alocarDisciplinaParaProfessor(disciplinaAtual, professorMaiorProbabilidade, professoresComDisciplinas);
                        
                        relatorioDeDistribuicao.areaTexto.append("\n\t\tPROFESSOR ESCOLHIDO: " + professorMaiorProbabilidade.getNome()+"\n\n");
                        disciplinasTemp.removeDisciplina(0);
		}
		
		
		/*relatorioDeDistribuicao.areaTexto.append("\n\nPROBABILIDADE DE PEGAR A DISCIPLINA:\n\n");
		// Mostrando os professores e as probabilidades de pegar a disciplina.
		for (int pos = 0; pos < professoresPorDisciplinas.size(); pos++) {
			relatorioDeDistribuicao.areaTexto.append(professoresPorDisciplinas.get(pos).getDisciplina().toString()+"\n\n");
                        
			for (int p = 0; p < professoresPorDisciplinas.get(pos).getProfessores().size(); p++) {
                            relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
				relatorioDeDistribuicao.areaTexto.append("\t" + professoresPorDisciplinas.get(pos).getProfessores().get(p).getProfessores().getNome()
									+"  :  "+ professoresPorDisciplinas.get(pos).getProfessores().get(p).getProbabilidadePegarDisciplina()+"\n\n");
			}
		}*/	
	}
	
	public boolean verificarChoqueHorario(Professor professor, Disciplina disciplina ) {
			 
		// Nesse  laço vou percorrer todos os horarios cadastrados
		for(int j = 0; j < horario.getHorario().size(); j++) {
                      if(horario.getHorario().get(j).encontrarItem(professor, disciplina)){
                            return true;
                      }
		}
		
		return false;
        }
	
       
	public void alocarDisciplinaParaProfessor(Disciplina disciplina, Professor professor, ArrayList<ProfessoresAlocados> professoresComDisciplinas) {
		
		for (int iCount = 0; iCount < horario.getHorario().size(); iCount++) {
			
                        relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
                         for(int z = 0; z < horario.getHorario().get(iCount).getItemList().size(); z++)
			if (disciplina.equals(horario.getHorario().get(iCount).getItem(z).getDisciplina())) {
				relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
				horario.getHorario().get(iCount).getItem(z).setProfessor(professor);
                                
				// Foi criado uma lista de "PROFESSORES ALOCADOS"
				// nessa lista eu verifico os professores que
				// que tem disciplinas alocadas e a quantidade de
				// disciplinas.
				int pos = retornaPosicaoProfessorNaLista(professor, professoresComDisciplinas);
				if (pos == -1) {
					ProfessoresAlocados profAlocados = new ProfessoresAlocados(professor);
					profAlocados.incrementaDisciplinasProfessor();
					profAlocados.adicionarDisciplina(disciplina);
					professoresComDisciplinas.add(profAlocados);
                                        //Cada intem horário é correpondente a uma Carga horaria de 2 horas
                                        professoresComDisciplinas.get(professoresComDisciplinas.size()-1).addChD(2);
				} else {
					boolean disciplinaJaAlocada = false;
                                        professoresComDisciplinas.get(pos).addChD(2);
                                        //Verifica se a disciplina já foi cadastrada anteriormente(ela pode esta presente em mais de um item de horario)
					for (int x = 0; x < professoresComDisciplinas.get(pos).getDisciplinasPegas().size(); x++) {
						if (disciplina.equals(professoresComDisciplinas.get(pos).getDisciplinasPegas().get(x))) {
							disciplinaJaAlocada = true;
							break;
						}
					}
					if (!disciplinaJaAlocada) {
						professoresComDisciplinas.get(pos).adicionarDisciplina(disciplina);
						professoresComDisciplinas.get(pos).incrementaDisciplinasProfessor();
					}
                                        //javax.swing.JOptionPane.showMessageDialog(null, professoresComDisciplinas.get(pos).listarAtividades());
				}
                                
			}
		}
		
	}
        
        public void removerProfessoresDoHorario(){
            for(int i = 0; i < horario.getHorario().size(); i++){
                for (int j = 0; j < horario.getHorario().get(i).getItemList().size(); j++){
                    horario.getHorario().get(i).getItem(j).setProfessor(null);
                }
            }
        }

	public void distribuirProfessoresParaDisciplinas() {
                //Este arrylist local é utilizado para controlar quais diciplnas já possuem professores,
                //é idependente dos registro de horários, pois esté é usado para arquivar um novo sorteio
                // e alocar um novo horário
		 ArrayList<ProfessoresAlocados> professoresComDisciplinas = new ArrayList<ProfessoresAlocados>();
               
                 removerProfessoresDoHorario();
                //exibirRelatorioDeDistribuicao();
		distribuirDisciplinasQueSomenteUmProfessorEscolheu(professoresComDisciplinas);
                relatorioDeDistribuicao.areaTexto.append("PROFESSORES QUE JÁ PEGARAM DICIPLINAS:\n");
		for (int i = 0; i < professoresComDisciplinas.size(); i++) {
			relatorioDeDistribuicao.areaTexto.append("\n\n"+ professoresComDisciplinas.get(i).toString()+"\n\n");
		}

		distribuirDisciplinasParaProfessores(professoresComDisciplinas);
		
		relatorioDeDistribuicao.areaTexto.append("\n\n\tRELAÇÃO DE PROFESSORES E DISCIPLINAS ALOCADAS\n\n");
		// Aqui vou demonstrar as disciplinas que foram alocadas para cada professor.
		for (int i = 0; i < professoresComDisciplinas.size(); i++) {
                    relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
			relatorioDeDistribuicao.areaTexto.append("\n\n   "+(i+1)+" - "+ professoresComDisciplinas.get(i).toString()+"\n\n");			
		}
		//Relatorio de Disciplinas que ficaram sem professores
		relatorioDeDistribuicao.areaTexto.append("\n\n\tDISCIPLINAS SEM PROFESSORES:"+"\n");
		for(int i = 0; i < horario.getHorario().size(); i++) {
                    relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
			if (horario.getHorario().get(i).getItem(0).getProfessor() == null)
				relatorioDeDistribuicao.areaTexto.append(horario.getHorario().get(i).getItem(0).getDisciplina().toString()+"\n\n");
		}
                //Relatorio de professores que ficaram sem diciplinas
                relatorioDeDistribuicao.areaTexto.append("\n\n\tPROFESSORES SEM DISCIPLINAS:\n\n");
                for(int i = 0; i <cadastroDeProfessor.getProfessores().getProfessores().size();i++){
                        boolean verifica = true;
                        for(int j = 0; j<horario.getHorario().size();j++){
                            relatorioDeDistribuicao.barraProgresso.setValue(valorBarra++);
                            for(int x = 0; x < horario.getHorario().get(j).getItemList().size();x++)
                            if(cadastroDeProfessor.getProfessores().getProfessores().get(i).getNome().equals(horario.getHorario().get(j).getItem(x).getProfessor().getNome()))
                                    verifica = false;
                        }
                   if(verifica){
                                    relatorioDeDistribuicao.areaTexto.append("\n\t"+(i+1)+" - "+cadastroDeProfessor.getProfessores().getProfessores().get(i).getNome()+"\n");
                                    //Garantindo que caso algum professor não tenha sido armazenado em professoremComDisciplinas ele pase a ser.
                                    professoresComDisciplinas.add(new ProfessoresAlocados(cadastroDeProfessor.getProfessores().getProfessores().get(i)));
                   }     
                }
                //Atualiza a lista de professores com disciplinas global
                //Um estrutura de dados chamada ProfessoresComDisciplinas foi criada para tal
                //Esta lista será usada na Segunda Etapa do Trabalho Final(Etapa Dinâminca)
                this.professoresComDisciplinas.setProfessoresComDisciplinas(professoresComDisciplinas);
                //relatorioDeDistribuicao.barraProgresso.setValue(1000);
		// Testar a Rede bayesiana
//		BayesianNetwork bn = new BayesianNetwork();
//		bn.buildNet();
//		bn.desenhaRede();
//		bn.simularCasosTeste();
//		System.out.println(bn.inferirProbabilidade("zero", "alta", "nao"));
//		System.out.println(bn.inferirProbabilidade("uma", "alta", "nao"));
//		System.out.println(bn.inferirProbabilidade("zero", "media", "nao"));

	}

	private void jMenuCarregarActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jMenuCarregarActionPerformed
	//exibirRelatorioDeDistribuicao(); //Futuramente comentar toda esta linha	, está vai estar presente apenas enqanto o carregar acinar automaticamente a distribuição de professores
            JFileChooser fileChooser = new JFileChooser();
		fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
		configFiltrosJFileChooser(fileChooser, 1);

		int result = fileChooser.showOpenDialog(this);
		if (result == JFileChooser.CANCEL_OPTION) {
			return;
		}

		// **********************************
		Dados dados;
		String nomeArquivo = fileChooser.getSelectedFile().getAbsolutePath();
		// javax.swing.JOptionPane.showMessageDialog(null, nomeArquivo);
		try {
			arquivoEntrada = new ObjectInputStream(new FileInputStream(
					nomeArquivo));
			try {
				dados = (Dados) arquivoEntrada.readObject();
				arquivoEntrada.close();
			} catch (ClassNotFoundException ex) {
				javax.swing.JOptionPane
						.showMessageDialog(
								null,
								"Erro de Entrada e Saída\nErro de abertura do arquivo",
								"Erro de Entrada e Saída",
								javax.swing.JOptionPane.ERROR_MESSAGE);
				arquivoEntrada.close();
				return;
			}
			cadastroDeProfessor.setProfessores(dados.getProfessores());
			cadastroDeDisciplina.setDisciplinas(dados.getDisciplinas());
			horario = dados.getHorario();
                        //as 2 linhas abaixo carregam arquivos csv para testes.
                       // carregarProfessores();
			//carregarHorarioAulas();
                        // Distribuir professores para as disciplinas
			//distribuirProfessoresParaDisciplinas();
			

			
			realocarReferencias(); // Realocar Referencias Horario
                        inicializarProfessoresComAfinidades();
                        setPainelInicial();
			this.setTitle("Distribuição de Disciplinas UFG - DDUFG: "
					+ nomeArquivo);
		} catch (Exception ioException) {
			javax.swing.JOptionPane
					.showMessageDialog(
							null,
							"O Arquivo não pode ser carregado\nVerifique se o nome foi digitado corretamente ou\nse é compativel ou se ele realmente existe.");
		}
		// Para atualizar a exibição gráfica dos dados, voltar a tela inicial
		//setPainelInicial();
		// ___________________________________
	}// GEN-LAST:event_jMenuCarregarActionPerformed

	void configFiltrosJFileChooser(JFileChooser file, int op) {
		// Configurando o filtro de extenções
		
            if(op==1){
                    file.setFileFilter(new javax.swing.filechooser.FileFilter() {
			// Filtro, converte as letras em minúculas antes de comparar

			@Override
			public boolean accept(File f) {
				return f.getName().toLowerCase().endsWith(".hufg")
						|| f.isDirectory();
			}

			// Texto que será exibido para o usuário

			@Override
			public String getDescription() {
				return "Arquivos DDUFG (.hufg)";
			}
		});
            }// FIM DA CONFIGURAÇÃO DOS FILTROS
            else if(op==2){file.setFileFilter(new javax.swing.filechooser.FileFilter() {
			// Filtro, converte as letras em minúculas antes de comparar

			@Override
			public boolean accept(File f) {
				return f.getName().toLowerCase().endsWith(".ativ")
						|| f.isDirectory();
			}

			// Texto que será exibido para o usuário

			@Override
			public String getDescription() {
				return "Arquivos DDUFG (.ativ)";
			}
		});
            }
	}

	private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jButton5ActionPerformed
		painelExibir.setVisible(false);
		painelExibir.removeAll();
		verHorarioCompleto.configurarImpressao(horario);
		painelExibir.add(verHorarioCompleto, java.awt.BorderLayout.CENTER);
		painelExibir.repaint();
		painelExibir.setVisible(true);
	}// GEN-LAST:event_jButton5ActionPerformed

	private void limparHorarioActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_limparHorarioActionPerformed
		horario = new Horario();
		realocarReferencias();
                //Configurando visualizações
                for(int i = 1; i <= 8; i++)verHorarioPorPeriodo.configurarImpressao(horario, i);
		
                
                verHorarioCompleto.configurarImpressao(horario);
                
                excluirHorariosEItens.configuraListaDeHorarios();
                excluirHorariosEItens.configuraListaDeItens();
           // removerProfessoresDoHorario();
	}// GEN-LAST:event_limparHorarioActionPerformed

	private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jMenuItem2ActionPerformed
		Sobre sobre = new Sobre();
		sobre.setVisible(true);
	}// GEN-LAST:event_jMenuItem2ActionPerformed

	private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_jButton4ActionPerformed
		painelExibir.setVisible(false);
		painelExibir.removeAll();
                for(int i = 1; i <= 8; i++)verHorarioPorPeriodo.configurarImpressao(horario, i);
		painelExibir.add(verHorarioPorPeriodo, java.awt.BorderLayout.CENTER);
                
		painelExibir.repaint();
		painelExibir.setVisible(true);
	}// GEN-LAST:event_jButton4ActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem cadAtividades;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton10;
    private javax.swing.JButton jButton11;
    private javax.swing.JButton jButton12;
    private javax.swing.JButton jButton13;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    private javax.swing.JButton jButton6;
    private javax.swing.JButton jButton7;
    private javax.swing.JButton jButton8;
    private javax.swing.JButton jButton9;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenu jMenu4;
    private javax.swing.JMenu jMenu5;
    private javax.swing.JMenu jMenuArquivo;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuCarregar;
    private javax.swing.JMenuItem jMenuCarregar2;
    private javax.swing.JMenu jMenuEditar;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem10;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JMenuItem jMenuItem6;
    private javax.swing.JMenuItem jMenuItem7;
    private javax.swing.JMenuItem jMenuItem8;
    private javax.swing.JMenuItem jMenuItem9;
    private javax.swing.JMenuItem jMenuSalvar;
    private javax.swing.JMenuItem jMenuSalvar2;
    private javax.swing.JMenu jMenuSobre;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JPopupMenu.Separator jSeparator2;
    private javax.swing.JPopupMenu.Separator jSeparator3;
    private javax.swing.JMenuItem limparHorario;
    private javax.swing.JPanel painelBotoes;
    private javax.swing.JPanel painelExibir;
    private javax.swing.JPanel painelPrincipal;
    // End of variables declaration//GEN-END:variables
	// Variaveis de instacia par armazenamento de dados
	CadastroDeProfessor cadastroDeProfessor;
	CadastroDeDisciplina cadastroDeDisciplina;
	VerDisciplinas verDisciplinas;
	VerDisciplinaPorPeriodo verDisciplinaPorPeriodo;
	VerProfessores verProfessores;
	RegistroDeHorario alocacaoDeHorario;
	CadastroDeHorario cadastroDeHorario;
	VerHorarioCompleto verHorarioCompleto;
	VerHorarioPorPeriodo verHorarioPorPeriodo;
        RelatorioDeDistribuicao relatorioDeDistribuicao;
        CadastroDeAtividades cadastroDeAtividades;
        LancarAtividades lancarAtividades;
        RelatorioDeAtividades relatorioDeAtividades;
        RegistroDeAfinidadeDeProfessor registroDeAfinidadeDeProfessor;
        ExcluirHorariosEItens excluirHorariosEItens;
        ProfessoresComDisciplinas professoresComDisciplinas;
	Horario horario;
        ProfessorAfinidadeAtividade professorAfinidadeAtividade;
        AtividadesCadastradas atividadesCadastradas;//Atividades Parte 2 do trabalho de SIAD
        int valorBarra;//Configura a barra de progreço do relatorio de distribuição.
        BayesianNetwork bn;//Rede Bayesiana
	// *********************************
	// Utizados para salvar e carregar
	private ObjectOutputStream arquivoSaida;
	private ObjectInputStream arquivoEntrada;
	// *************************************
}
